package com.example.mvvm.data.network
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.converter.scalars.ScalarsConverterFactory

/*
object关键字主要有三种使用场景

    对象声明（object declaration）
    伴生对象（companion object）
    对象表达式（object expression）

        1.对象声明
        将类的声明和定义该类的单例对象结合在一起（即通过object就实现了单例模式）
        对象声明中不能包含构造器（包括主构造器和次级构造器）

        2.伴生对象
        因为在kotlin中是没有static关键字的，也就意味着没有静态方法和静态成员。那么在kotlin中如果想要表达这种概念，
        可以使用包级别函数（package-level funcation）和伴生对象（companion object）。
        class ClassName {
        // 伴生对象名可以省略，默认为Companion
            companion object 伴生对象名 {
        // define field and method
            }
        }

        3.对象表达式
        常用作为匿名内部类表达式
        private val callBack = object : CallBack {

            override fun onSuccess() {}

            override fun onFailure() {}
        }

        // 通过对象表达式实现点击事件回调
        btn.setOnClickListener(object : View.OnClickListener {
            override fun onClick(v: View) {

            }
        })

 */

object ServiceCreator {
    private const val BASE_URL = "http://guolin.tech/"

    private val httpClient = OkHttpClient.Builder()

    private val builder = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(httpClient.build())
        .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())

    private val retrofit = builder.build()
    fun <T> create(serviceClass: Class<T>): T = retrofit.create(serviceClass)
}